<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>组件通信</title>
  <script src="./vue.js"></script>
</head>
<body>
  <div id="app">
    <guanyu></guanyu>
    <hr>
    <zhangfei></zhangfei>
  </div>
</body>
</html>
<script>
  // 组件通信
  // 1. 父向子传值
  // 1.1 父亲 通过属性给子组件传值
  // 1.2 儿子：通过props接受值
  // 2. 子向父传值 可以理解为 父给子传递一个函数或发布订阅
  // 2.1 父亲 通过v-on传递  v-on:yy="callback"
  // 2.2 儿子：通过$emit('yy', 6666)调用父亲给我传递的函数并传递参数
  // 也可以通过发布订阅方式理解：
  // 父亲订阅公众号v-on:yy="callback" 父亲订阅和儿子发布一定要是同一个公众号
  // 儿子通过公众号发布消息$emit('yy', 6666) yy就好比公众号
  // 3. 非父子通信 事件总线 非父子包含兄弟但不局限兄弟
  // 3.1 创建一个事件总线
  var bus = new Vue()
  // 3.2 发布消息 通过bus发布
  // 3.3 接受消息 通过bus接受
  // 定义组件
  Vue.component('guanyu', {
    template: `<div>
      <h2>我是你关二爷</h2>
      <button @click="sendFriend">给三弟翼德传值</button>
    </div>`,
    methods: {
      sendFriend () {
        // 3.2 发布消息 通过bus发布
        bus.$emit('yy', '荆州')
      }
    }
  })
  Vue.component('zhangfei', {
    data() {
      return {
        msg: ''
      }
    },
    template: `<div>
      <h2>你乃阉人张翼德--{{msg}}</h2>
    </div>`,
    created() {
      // 越早关注公众号越好 当然mounted ... 后面阶段也可以
      // 3.3 接受消息 通过bus接受
      bus.$on('yy', (v) => {
        // console.log(this.msg, v, 11111)
        this.msg = v
      })
    }
  })
  var vm = new Vue({
    el: '#app',
    methods: {
      callback (v) {
        console.log(v)
      }
    }
  })
</script>